package com.bookocean.domain.service;

import com.bookocean.controller.dto.FavoriteDto;
import com.bookocean.controller.dto.CommentDto;
import com.bookocean.controller.dto.PageResultDto;

/**
 * 互动领域服务接口
 * 
 * @author BookOcean
 * @since 2024-01-01
 */
public interface InteractionDomainService {

    /**
     * 点赞
     * 
     * @param targetId 目标ID
     * @param targetType 目标类型
     * @param userId 用户ID
     */
    void like(Long targetId, Integer targetType, Long userId);

    /**
     * 取消点赞
     * 
     * @param targetId 目标ID
     * @param targetType 目标类型
     * @param userId 用户ID
     */
    void unlike(Long targetId, Integer targetType, Long userId);

    /**
     * 收藏
     * 
     * @param targetId 目标ID
     * @param targetType 目标类型
     * @param userId 用户ID
     */
    void favorite(Long targetId, Integer targetType, Long userId);

    /**
     * 取消收藏
     * 
     * @param targetId 目标ID
     * @param targetType 目标类型
     * @param userId 用户ID
     */
    void unfavorite(Long targetId, Integer targetType, Long userId);

    /**
     * 获取评论列表
     * 
     * @param targetId 目标ID
     * @param targetType 目标类型
     * @param page 页码
     * @param pageSize 每页数量
     * @return 分页评论列表
     */
    PageResultDto<CommentDto> getComments(Long targetId, Integer targetType, Integer page, Integer pageSize);

    /**
     * 添加评论
     * 
     * @param targetId 目标ID
     * @param targetType 目标类型
     * @param userId 用户ID
     * @param content 评论内容
     * @param parentId 父评论ID（可选）
     */
    void comment(Long targetId, Integer targetType, Long userId, String content, Long parentId);

    /**
     * 回复评论
     * 
     * @param commentId 评论ID
     * @param userId 用户ID
     * @param content 回复内容
     */
    void replyComment(Long commentId, Long userId, String content);

    /**
     * 获取用户收藏列表
     * 
     * @param userId 用户ID
     * @param targetType 目标类型（可选）
     * @param page 页码
     * @param pageSize 每页数量
     * @return 分页收藏列表
     */
    PageResultDto<FavoriteDto> getUserFavorites(Long userId, Integer targetType, Integer page, Integer pageSize);
}
